package com.wuji1626.spark.rdd.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object RDD_Transform_aggregateByKey_average {

  def main(args: Array[String]): Unit = {
    // Step1: 准备环境
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)
    // Step2: 算子 aggregateByKey
    // 数据分区【("a",1),("a",2)】【("a",3),("a",4)】
    val rdd = sc.makeRDD(List(("a",1),("a",2),("b",3),("b",4),("b",5),("a",6)),numSlices = 2)
    // 初始值 (0,0)，tuple 的第一个元素为求和，第二个值为 key 出现的次数
    val averageRDD: RDD[(String,(Int, Int))] = rdd.aggregateByKey(zeroValue = (0, 0))(
      (t, v) => {
        // 分区内，tuple 第一个元素为值相加，第二个元素为次数相加
        (t._1 + v, t._2 + 1)
      },
      // 分区间，tuple 中的元素，第一个元素值相加，第二个元素数量相加
      (t1, t2) => {
        (t1._1 + t2._1, t1._2 + t2._2)
      }
    )
    // RDD 中，如果 Key 保持不变，只对 Value 进行处理，可以使用 mapValues() 算子
    averageRDD.mapValues{
      case (num, cnt) => {
        num / cnt
      }
    }.collect().foreach(println)
    // Step3: 关闭环境
    sc.stop()
  }
}
